package account

import (
	"C"
	"encoding/json"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"io/ioutil"
	"log"
	"moko/manifest/config"
	"time"
)

type Users struct {
	ID        int       `gorm:"column:id;primary_key;AUTO_INCREMENT"`
	Username  string    `gorm:"column:username;NOT NULL"`         // 用户名
	Password  string    `gorm:"column:password;NOT NULL"`         // 密码
	Mobile    uint      `gorm:"column:mobile;NOT NULL"`           // 手机号
	Locked    int       `gorm:"column:locked;default:0;NOT NULL"` // 是否被封禁
	LastTime  time.Time `gorm:"column:last_time"`                 // 最后一次登录时间
	CreatedAt time.Time `gorm:"column:created_at;NOT NULL"`       // 创建时间
	UpdatedAt time.Time `gorm:"column:updated_at"`                // 更新时间
}

type UserQuery struct {
	Mobile   uint   `json:"mobile"`
	Password string `json:"password"`
	Username string `json:"username"`
}

func ConnectDB() *gorm.DB {
	// 读取配置文件
	data, err := ioutil.ReadFile("manifest/config/database_mysql.json")
	if err != nil {
		log.Printf("读取配置文件失败: %v", err.Error())
		panic(err)
	}
	var cfg config.DatabaseConfig
	err = json.Unmarshal(data, &cfg)
	if err != nil {
		log.Printf("解析配置文件失败: %v", err.Error())
		panic(err)
	}

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Database)
	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	// 自动迁移表结构
	err = db.AutoMigrate(&Users{})
	if err != nil {
		panic(err)
	}
	return db
}

func CreateUser(userData Users) uint {
	db := ConnectDB()

	result := db.Create(&userData)
	if result.Error != nil {
		panic(result.Error)
	}

	return uint(userData.ID)
}

func GetUserByMobile(mobile uint) Users {
	// 调用ConnectDB方法获取数据库连接实例
	db := ConnectDB()
	var user Users
	// 使用Where条件查询，根据手机号查找对应的用户记录
	result := db.Where("mobile =?", mobile).First(&user)
	if result.Error != nil {
		return Users{}
	}
	return user
}

func GetUser(data UserQuery) Users {
	db := ConnectDB()
	var user Users
	// 使用Where条件查询，根据手机号查找对应的用户记录
	result := db.Where(data).First(&user)
	if result.Error != nil {
		return Users{}
	}
	return user
}

func GetUserById(id uint) Users {
	db := ConnectDB()
	var user Users
	// 使用Where条件查询，根据手机号查找对应的用户记录
	result := db.Where("id =?", id).First(&user)
	if result.Error != nil {
		return Users{}
	}
	return user
}
